package com.gxuwz.medical.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.gxuwz.medical.database.DBUtil;
import com.gxuwz.medical.domain.family.Family;
import com.gxuwz.medical.domain.person.Person;
import com.gxuwz.medical.domain.vo.Page;

/**
 *  农民档案管理
 * @author 沉羽墨玖
 *
 */
public class PersonDao extends BaseDao {
	private static final String SQL_SELECT_PERSCODE = "select * from person where persCode=?";

	@Override
	protected Person handle(ResultSet rs) throws Exception {

		Person person = new Person();
		person.setPersCode(rs.getString("persCode"));
		// 关联家庭档案信息
		person.setFamily(new Family(rs.getString("famCode")));
		person.setRuralCard(rs.getString("ruralCard"));
		person.setRelation(rs.getString("relation"));
		person.setCardId(rs.getString("cardId"));
		person.setPersName(rs.getString("persName"));
		person.setAge(rs.getInt("age"));
		person.setSex(rs.getString("sex"));
		person.setBirthday(rs.getString("birthday"));
		person.setPersPro(rs.getString("persPro"));
		person.setRural(rs.getBoolean("isRural"));
		person.setOccupation(rs.getString("occupation"));
		person.setWorkUnit(rs.getString("workUnit"));
		person.setLiveAddress(rs.getString("liveAddress"));
		person.setTelephone(rs.getString("telephone"));
		return person;

	}

	/**
	 * 查找对应的农民档案记录并转为对象实例
	 * 
	 * @param persCode
	 * @return
	 * @throws Exception
	 */
	public Person get(String persCode) throws Exception {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DBUtil.getConn();
			pstmt = conn.prepareStatement(SQL_SELECT_PERSCODE);
			int index = 1;
			pstmt.setString(index, persCode);
			rs = pstmt.executeQuery();
			return handle(rs);
		} catch (SQLException e) {
			throw new SQLException("读取persCode记录失败", e);
		}
	}

	/**
	 * @param sql
	 * @param params
	 * @return
	 * @throws Exception
	 */
	public List<Person> queryObjects(String sql, Object[] params)
			throws Exception {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<Person> results = new ArrayList<Person>();
		try {
			conn = DBUtil.getConn();
			pstmt = conn.prepareStatement(sql);
			int index = 1;
			if (params != null) {
				for (Object param : params) {
					if (param instanceof String) {
						pstmt.setString(index++, (String) param);
					}
					if (param instanceof Integer) {
						pstmt.setInt(index++, (Integer) param);
					}
					if (param instanceof Float) {
						pstmt.setFloat(index++, (Float) param);
					}
				}

			}
			rs = pstmt.executeQuery();
			while (rs.next()) {
				Person person = handle(rs);
				results.add(person);
			}
			return results;
		} catch (SQLException e) {
			throw new SQLException("执行SQL[" + sql + "]失败", e);
		}
	}

	/**
	 * 分页
	 * 
	 * @param 如select
	 *            * from person where persCode=?
	 * @param params
	 * @param page
	 * @param size
	 * @return
	 * @throws Exception
	 */
	public Page queryOjectsByPage(String sql, Object[] params, int pageNo,
			int size) throws Exception {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Page page = null;
		List<Person> datas = new ArrayList<Person>();
		try {
			int start = (pageNo - 1) * size;
			conn = DBUtil.getConn();
			pstmt = conn.prepareStatement(sql + " limit " + start + "," + size);
			int index = 1;
			if (params != null) {
				for (Object param : params) {
					if (param instanceof String) {
						pstmt.setString(index++, (String) param);
					}
					if (param instanceof Integer) {
						pstmt.setInt(index++, (Integer) param);
					}
					if (param instanceof Float) {
						pstmt.setFloat(index++, (Float) param);
					}
				}
			}
			rs = pstmt.executeQuery();
			while (rs.next()) {
				Person person = handle(rs);
				datas.add(person);
			}
			// 统计SQL对应记录数
			int total = count(sql, params);
			page = new Page(total, pageNo, size, datas);
			return page;
		} catch (SQLException e) {
			throw new SQLException("执行SQL[" + sql + "]失败", e);
		}

	}

}
